#include<iostream>
#include<signal.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;





//SIGCHLD信号:
//如果有10个子进程同时退出，不是都会向父进程发送shchld因为是普通信号，pending为图表示收到信号但只会记录一次
//如果有10个子进程，5个退了，5个永远不会退出；waitpid阻塞了
// void notice(int signum)
// {
//     std::cout << "get a signal: " << signum << " pid: " << getpid() << std::endl;
//     while(true)
//    { 
//         pid_t rid = waitpid(-1,nullptr,0);
//         pid_t rid = waitpid(-1,nullptr,WNOHANG);//阻塞了-》非阻塞方式
//         if(rid>0)
//         {
//             cout<<"wait success"<<endl;
//         }
//         else if(rid<0)
//         {
//             cout<<"wait child success done"<<endl;
//             break;
//         }
//         else
//         {
//             cout<<"wait child success done"<<endl;
//             break;
//         }
//     }
// }
// void DoOtherThing()
// {
//     cout<<"DoOtherThing~"<<endl;
// }
// int main()
// {
//     signal(SIGCHLD,notice);

// for(int i=0;i<10;i++)
//     {pid_t id =fork();
//     if(id==0)
//     {
//         cout<<"I am child process pid:"<<getpid()<<endl;
//         sleep(3);
//         exit(1);
//     }}
//     //父进程
//     while(true)
//     {
//         DoOtherThing();
//         sleep(1);
//     }
//     return 0;
// }



//volatile关键字：防止过度优化
// volatile int flag = 0; 
// void handler(int sig) 
// { 
// printf("chage flag 0 to 1\n"); 
// flag = 1; 
// } 
// int main() //没有任何代码可以对gflag进行修改
// { 
// signal(2, handler); 
// while(!flag); //while循环本质是cpu不断对flag进行监测；编译器过度优化就会使2号信号无效因为优化之后寄存器隐藏了内存的数值
// printf("process quit normal\n"); 
// return 0; 
// } 



//如果当前正在对特定信号进行处理，默认特定信号会自动屏蔽
//当特定信号处理完成时，会自动解除对特定信号的屏蔽
//防止受到大量的相同信号进行递归式的调用
// void Print(sigset_t &pending)
// {
//     for(int sig = 31; sig > 0; sig--)
//     {
//         if(sigismember(&pending, sig))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }
// void handler(int signum)
// {
//     cout<<"get a signum:"<<signum<<endl;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         Print(pending);
//         sleep(2);
//     }
//     exit(1);
// }
// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);//sa_mask:如果还想处理2号信号（OS对2号信号自动屏蔽），同时对其他信号也进行屏蔽
//     sigaddset(&act.sa_mask,3);
//     act.sa_flags=0;
//     sigaction(2,&act,&oact);

//     while(true)
//     {
//         cout<<"I am a process: pid:"<<getpid()<<endl;
//         sleep(1);
//     }
//     return 0;
// }